*! NJC 20 Sept 2001  
*! version 2.0.4  19oct2000
program define _ggroup2
	version 7
	gettoken type 0 : 0
	gettoken g    0 : 0
	gettoken eqs  0 : 0

	syntax varlist [if] [in] [, Missing BY(string) Label /*
		*/ Truncate(numlist max=1 int >= 1) SOrt(str) ]

	if `"`by'"' != "" {
		_egennoby group() `"`by'"'
		/* NOTREACHED */
	}

	if "`truncate'" != "" & "`label'" == "" {
		di as err "truncate() option requires the label option"
		exit 198
	}

	tempvar touse
	quietly {
		mark `touse' `if' `in'
		if "`missing'"=="" { 
			markout `touse' `varlist', strok
		}

		if "`sort'" != "" { 
			tempvar sresult
			local hold "$EGEN_Varname"
			capture egen `sresult' = `sort', by(`touse' `varlist')  
			global EGEN_Varname `hold' 
			if _rc { 
				di as err "invalid sort(`sort')" 
				exit 198 
			}
			local stext " by `sort'" 
		}
		* `sresult' will be blank if -sort()- not used
		* `stext' ditto 
				
		sort `touse' `sresult' `varlist'
		quietly by `touse' `sresult' `varlist': /*
			*/ gen `type' `g'=1 if _n==1 & `touse'
		replace `g'=sum(`g')
		replace `g'=. if `touse'!=1
		
		if "`label'"!="" {
			local dfltfmt : set dp 
			local dfltfmt = /*
				*/ cond("`dfltfmt'"=="period","%9.0g","%9,0g")
			local truncate=cond("`truncate'"=="","80","`truncate'")

			count if !`touse'
			local j = 1 + r(N)
			sum `g', meanonly
			local max `r(max)'
			local i 1
			while `i' <= `max' {
				tokenize `varlist'
				local vtmp " "
				local x 1
				while "`1'"!="" {
					local vallab : value label `1'
					local val = `1'[`j']
					if "`vallab'" != "" {
local vtmp2 : label `vallab' `val' `truncate'
					}
					else {
						cap confirm numeric var `1' 
						if _rc==0 {
local vtmp2 = string(`1'[`j'],"`dfltfmt'") 
						}
						else {
local vtmp2 = trim(substr(trim(`1'[`j']),1,`truncate'))
						}
					}
					local x = `x' + length("`vtmp2'") + 1
					local vtmp "`vtmp' `vtmp2'"
					mac shift
				}

				if `x' >= 80 {
					local over = "over"
				}
				local val `vtmp'
				label def $EGEN_Varname `i' "`val'", modify
				count if `g' == `i'
				local j = `j' + r(N)
				local i = `i' + 1
			}
			label val `g' $EGEN_Varname
			if "`over'" != "" {
				noi di as txt _n /*
*/ "note: value labels exceed 80 characters and were truncated;" _n /* 
*/ "      use the truncate() option to control this"
			}
		}
	}

	if length("group(`varlist'`stext')") > 80 {
		note `g' : group(`varlist'`stext')
		label var `g' "see notes"
	}
	else 	label var `g' "group(`varlist'`stext')"
end
